package carmadness.model;

/**
 * A rablót megvalósító osztály.
 * 
 * @author Metzing Arpad
 * @version 1.0
 * @created 10-Apr-2010 2:32:42 PM
 */
public class Robber extends Vehicle implements ISteppable
{
	/**
	 * A létrehozott példányok száma.
	 */
	private static int instances;
	/**
	 * A játékos hátralévő életeinek száma.
	 */
	private int lives;
	/**
	 * A játékos sebezhetetlenségéből hátralévő idő
	 */
	private int timeLeftOfImmortality = 0;

	/**
	 * Alapértelmezett konstruktor. A jármű döntési stratégiáját felhasználó által
	 * vezéreltre állítja.
	 */
	public Robber()
	{
		this( new HumanStrategy() );
	}

	/**
	 * Konstruktor.
	 * Beállítja a rabló életeinek számát, alapsúlyát, és eggyel növeli a példányok számát.
	 * 
	 * @param _strategy
	 *            A rabló által alkalmazandó döntésmechanizmus.
	 */
	public Robber( Strategy _strategy )
	{
		super( _strategy );

		this.lives = 3;
		this.weight = 10;
		this.baseWeight = 10;
		Robber.instances++;
		World.getInstance().registerSteppable( this );
	}

	/**
	 * Visitor minta szerinti accept metódus közlekedési szabályok 
	 * alkalmazására és útelemen történő elnyelődések kezelésére.
	 * 
	 */
	public void accept( IVehicleVisitor visitor )
	{
		visitor.visitVehicle( this );
	}

	/**
	 * Eggyel csökkenti a játékos életeinek számát.
	 */
	public void decreaseLives()
	{
		this.lives--;
		if ( this.lives == 0 )
		{
			World.getInstance().loseGame( this );
		}
	}

	/**
	 * Visszaadja a hátralévő életek számát.
	 * 
	 * @return int életek száma
	 */
	public int getLives()
	{
		return this.lives;
	}

	/**
	 * Visszatér a példányok számával.
	 * 
	 * @return int Robber példányok száma
	 */
	public static int getInstanceCount()
	{
		return Robber.instances;
	}

	/**
	 * Visszatér a halhatatlansági időből hátralévő időegységek számával.
	 * 
	 * @return
	 */
	public int getImmortalityLeft()
	{
		return this.timeLeftOfImmortality;
	}

	/**
	 * A Visitor minta szerinti visit metódus. A sebességkorlátozás nem érdekli
	 * a rablót.
	 * 
	 * @param rule
	 *            SpeedLimit típusú szabály.
	 */
	public void visitRule( SpeedLimit rule )
	{
		return;
	}

	/**
	 * Rabló közlekedési lámpánál. 
	 * A közlekedési lámpának nincs hatása a rablóra.
	 * 
	 * @param rule
	 *            TrafficLight típusú szabály.
	 */
	public void visitRule( TrafficLight rule )
	{
		return;
	}

	/**
	 * Rabló stop táblánál. 
	 * A stop táblának nincs hatása a rablóra.
	 * 
	 * @param rule
	 *            StopSign típusú szabály.
	 */
	public void visitRule( StopSign rule )
	{
		return;
	}

	/**
	 * Rabló találkozása húsvéti nyuszival.
	 * Ha a húsvéti nyuszi szabállyal találkozik a rabló, (újabb) 20 időegységre
	 * halhatatlanságot élvez.
	 * 
	 * @param bunny
	 */
	public void visitRule( Bunny bunny )
	{
		this.timeLeftOfImmortality += 20;
	}

	/**
	 * Egy útelemen lévő rablóba "hátulról" beleütközött egy civil
	 * 
	 * @param Civilian
	 *            vehicle - a civil
	 */
	public void visitVehicle( Civilian vehicle )
	{
		// ILYEN ELVILEG NEM FORDULHAT ELO"!!!
		this.decreaseLives();
	}

	/**
	 * Egy útelemen lévő rablóba "hátulról" beleütközött egy rendőr
	 * 
	 * @param Police
	 *            vehicle - a rendőr
	 */
	public void visitVehicle( Police vehicle )
	{
		// Ha éppen halhatatlanok vagyunk, öljük meg a rendőrt
		if ( this.getImmortalityLeft() > 0 )
			vehicle.kill();
		// Egyébként haljunk meg
		else
			this.kill();

	}

	/**
	 * Egy útelemen lévő rablóba "hátulról" beleütközött egy másik rabló
	 * (multiplayerre előkészítve)
	 * 
	 * @param Rabló
	 *            vehicle - a rabló
	 */
	public void visitVehicle( Robber vehicle )
	{
		vehicle.decreaseLives();
		this.decreaseLives();
	}

	/**
	 * A rabló megsemmisítéséért felel.
	 * 
	 * Életek lenullázása, kocsi kiregisztrálása, a játéknak és mindennek vége.
	 */
	public void kill()
	{
		super.kill();
		
		lives = 0;
		
		Robber.instances--;
		World.getInstance().unregisterSteppable( this );

		World.getInstance().loseGame( this );
	}

	/**
	 * A húsvéti nyuszi által okozott halhatatlanság elévültetése miatt
	 * szükséges, hogy a rabló értesüljön az idő múlásáról.
	 */
	public void step()
	{
		if ( this.timeLeftOfImmortality > 0 ) timeLeftOfImmortality--;
	}

	/**
	 * Rablóra nem hat a szabályok által kikényszerített fékezés.
	 * 
	 * @return boolean - mindig hamissal tér vissza
	 * 
	 */
	public boolean applyBrake()
	{
		return false;
	}

	/**
	 * Rablóra nem hat a szabályok által kikényszerített fékezés.
	 * 
	 */
	public void releaseBrake()
	{
		return;
	}
	
	

}
